package com.wind.dao;

import com.wind.entity.Customer;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;

import java.util.List;

/**
 * 符合SpringDataJpa的dao层接口规范
 *      JpaRepository<操作的实体类类型，实体类中主键属性的类型>
 *          * 封装了基本CRUD操作
 *      JpaSpecificationExecutor<操作的实体类类型>
 *          * 封装了复杂查询（分页）
 */
public interface CustomerDao extends JpaRepository<Customer,Long>, JpaSpecificationExecutor<Customer> {

  /*
    自定义查询：根据用户姓名查用户
   */
  @Query(value = "from Customer where custName = ?1")
  Customer findJpql(String name);

  /*
    根据用户 ID 和 name 一块查（多个参数查询）：
      1）默认情况下 方法参数位置同 JPQL ? 位置一致。
      2）位置不同，需要指定（?2）
   */
  @Query(value = "from Customer where custName = ?2 and custId = ?1")
  Customer findCustIdAndNmae(Long id, String name);

  /*
    根据 ID 更新 name：
      @Query：仅仅代表查询。
      @Modifying：加上这个注解 才代表更新。
   */
  @Query(value = "update Customer set custName = ? where custId = ?") // 报错不影响，只是 IDEA 语法检查
  @Modifying
  int updateCustomer(String name, Long id);

  /*
    SQL查询:
     Query : 配置sql查询
         value ： sql语句
         nativeQuery：查询方式（true(sql查询) | false(jpql查询)）
   */
  @Query(value = "select * from springdatajpa_customer", nativeQuery = true)
  List<Customer> findBySQL();

  /*
    SQL 模糊查询：
   */
  @Query(value = "select * from springdatajpa_customer where cust_name like ?1", nativeQuery = true)
  Customer findBySqlLike(String name);

  /*
    方法命名规则查询：（）
      约定：
        findBy                  - 开头
        对象的属性名（首字母大写）  - 根据对象的哪个属性进行查询

      理解：
        在 SpringDataJpa 的运行阶段 会根据方法名称进行解析（findBy from  xxx(实体类) 属性名称 where custName =）
           1.findBy  + 属性名称 （根据属性名称进行完成匹配的查询=）
           2.findBy  + 属性名称 + “查询方式（Like | isnull）”
               findByCustNameLike
           3.多条件查询
               findBy + 属性名 + “查询方式”   + “多条件的连接符（and|or）”  + 属性名 + “查询方式”

      多参数因为无法只配，只能按照顺序写
   */
  Customer findByCustName(String custName);

  List<Customer> findByCustNameLike(String custName);

  //使用客户名称模糊匹配和客户所属行业精准匹配的查询
  public Customer findByCustNameLikeAndCustIndustry(String custName,String custIndustry);
}
